import { Entity, Column, ManyToMany, JoinTable } from 'typeorm';
import { BaseEntity } from '../common/base/base.entity';
import { Permission } from './permission.entity';

/**
 * 角色实体
 * 对应数据库中的 roles 表
 */
@Entity('roles')
export class Role extends BaseEntity {
  /**
   * 角色名称（唯一）
   * 例如：user, vip, svip, admin
   */
  @Column({
    type: 'varchar',
    length: 50,
    unique: true,
    comment: '角色名称（唯一标识）',
  })
  name: string;

  /**
   * 角色显示名称
   * 例如：普通用户、VIP会员、管理员
   */
  @Column({
    type: 'varchar',
    length: 100,
    comment: '角色显示名称',
  })
  displayName: string;

  /**
   * 角色描述
   */
  @Column({
    type: 'text',
    nullable: true,
    comment: '角色描述',
  })
  description?: string;

  /**
   * 角色等级
   * 用于排序和权限判断
   * 数值越大，权限越高
   */
  @Column({
    type: 'int',
    default: 1,
    comment: '角色等级（数值越大权限越高）',
  })
  level: number;

  /**
   * 是否是系统角色
   * 系统角色不能被删除
   */
  @Column({
    type: 'boolean',
    default: false,
    comment: '是否是系统角色（系统角色不能删除）',
  })
  isSystem: boolean;

  /**
   * 角色拥有的权限（多对多关系）
   *
   * @ManyToMany 装饰器说明：
   * - 一个角色可以有多个权限
   * - 一个权限可以被多个角色拥有
   *
   * @JoinTable 装饰器：
   * - 指定中间表的配置
   * - 只需要在关系的一方定义（通常是主控方）
   */
  @ManyToMany(() => Permission, (permission) => permission.roles, {
    cascade: true, // 级联操作
  })
  @JoinTable({
    name: 'role_permissions', // 中间表名称
    joinColumn: {
      name: 'role_id',
      referencedColumnName: 'id',
    },
    inverseJoinColumn: {
      name: 'permission_id',
      referencedColumnName: 'id',
    },
  })
  permissions: Permission[];
}
